<?php

class PedidosController extends AppController {
    var $name = 'Pedidos';
    
    public $components = array('Paginator', 'RequestHandler');
    public $helpers = array('Js');
  
    public $paginate = array(
            'limit' => 5,
            'order' => array(
                'Pedido.id' => 'asc',
                'Pedido.fecha' => 'asc',
            )
        );        
         
    function index() {          
        $this->loadModel('User');
        $this->loadModel('Parametro');

        $paga_cubierto = $this->Parametro->find('first', array('conditions' => array('Parametro.param_nombre' => 'paga_cubierto'),'fields' => array('Parametro.valor')));
        $precio_uni_cubierto = $this->Parametro->find('first', array('conditions' => array('Parametro.param_nombre' => 'precio_cubierto'),'fields' => array('Parametro.valor')));        
        $this->set('paga_cubierto', $paga_cubierto);
        $this->set('precio_uni_cubierto', $precio_uni_cubierto);

        // cargo 1: cocinero, 2: barman, 3: mozo, 4: admin
        $usuarios = $this->User->find('list',array(
                                    'fields' => array('id', 'nombre'), 
                                    'conditions' => array('User.cargo' => 3),
                                    'order' => 'User.nombre ASC',  
                                    'recursive' => -1)
                                );
        $this->set('users', $usuarios);
        // para llegar al Rubro asociado al subrubro del producto
        $this->Pedido->recursive = -1;
        $condiciones = array();
        $cond_estado = array();
        if (!empty($this->data)) {
            // hubo submit
            if (!empty($this->data['Pedido']['user_id'])) { 
                $condiciones['Pedido.user_id'] = $this->data['Pedido']['user_id'];
            }             
            if (!empty($this->data['Pedido']['filtro_abiertos'])) {
                // filtro por cerrado si marqué el check abiertos. si no traigo todos
                if(!($this->data['Pedido']['filtro_abiertos'])) {
                   $condiciones['Pedido.cerrado'] = 1;
                }
            } else {
                $condiciones['Pedido.cerrado'] = 1;
            }
            if (!empty($this->data['Pedido']['filtro_facturados'])) {
                if($this->data['Pedido']['filtro_facturados']) {
                    $cond_estado['Pedido.facturado'] = 1;
                } else {
                    $condiciones['Pedido.facturado'] = 0;
                }
            } else {
                $condiciones['Pedido.facturado'] = 0;
            }
            if (!empty($this->data['Pedido']['filtro_cancelados'])) {
                if($this->data['Pedido']['filtro_cancelados']) {
                    $cond_estado['Pedido.cancelado'] = 1;
                } else {
                    $condiciones['Pedido.cancelado'] = 0;
                }
            } else {
                $condiciones['Pedido.cancelado'] = 0;
            }
            if (count($cond_estado) > 0) {
                $condiciones['OR'] = $cond_estado;
            }             

        } else {
            // carga inicial de la pagina
            $condiciones['Pedido.cerrado'] = 1;
            $condiciones['Pedido.cancelado'] = 0;
            $condiciones['Pedido.facturado'] = 0;
        }
               
        $this->paginate = array(
            'limit' => 10,
            'conditions' => $condiciones,
            'contain' => array('Pedido'));
        
        // obtengo el listado para generar la grilla
        $data = $this->paginate($condiciones);
        $this->set('pedidos', $data);

        $this->data = $this->Pedido->create();        
        
    }
    
    public function detalle($id = null) {
        $this->loadModel('Empresa');
        $empresa = $this->Empresa->find('all');
        $this->set('empresa', $empresa[0]['Empresa']);
        $this->set('pedido', $this->Pedido->getPedidoDetalle($id));
    }    


    function cancelarpedido($id) {
        $pedido = $this->Pedido->findById($id);
        if ($this->validarCancelarPedido($pedido)) {
            $pedido['Pedido']['cancelado'] = 1;
            // cancela el usuario que esta logueado
            $pedido['Pedido']['user_id_autoriz'] = $this->Auth->user('id');            
            if ($this->Pedido->save($pedido)) {
                $this->Session->setFlash('El pedido fue cancelado.');
                $this->redirect(array('controller' => 'pedidos', 'action' => 'index'));                            
            }
        }         
    }
    
    function validarCancelarPedido($pedido) {
        if (($pedido['Pedido']['cancelado'] == 1) || ($pedido['Pedido']['facturado'] == 1)) {
            $this->Session->setFlash('El pedido fue cancelado previamente. No se puede anular este detalle.');
            return false;
        }        
        return true;
    }
    
    public function pagar($id = null) {        
        $this->loadModel('Pedidovalor');
        if (!empty($this->request->data)) {             
            $this->request->data['Pedidovalor'] = $this->request->data['Pedido'];            
            $this->Pedidovalor->set($this->request->data);
//            Debugger::dump($this->request->data);
            if ($this->Pedidovalor->validates()) {
                // it validated logic
                if ($this->Pedidovalor->save($this->request->data, array('validate' => false))) {
                    $this->Session->setFlash('El valor fue agregado.');
                    $this->set('pedido', $this->Pedido->getPedidoPago($this->request->data['Pedidovalor']['pedido_id']));
                    $this->redirect('/pedidos/pagar/'.$this->request->data['Pedidovalor']['pedido_id']);               
                } else {
  //                  echo 'no grabó';
                    $this->set('pedido', $this->Pedido->getPedidoPago($this->request->data['Pedidovalor']['pedido_id']));
                }
            } else {
                // didn't validate logic
                $this->set('pedido', $this->Pedido->getPedidoPago($this->request->data['Pedidovalor']['pedido_id']));
                $this->set('errores', $this->Pedidovalor->validationErrors);
//                Debugger::dump($errors);
            }
            
        } else {
//            echo 'hora de pagar';
            $this->set('pedido', $this->Pedido->getPedidoPago($id));
        }
    }    

    function validarPagoFactura($pedido_id) {
        $this->loadModel('Pedidovalor');
        // busca que no haya otro id con el mismo campo codigo        
        $pedido = $this->Pedido->getPedidoDetalle($pedido_id);
        $valores = $this->Pedidovalor->find('all', array('conditions' => array('pedido_id' => $pedido_id)));
        $impo_efectivo = 0;
        $impo_otros = 0;
        
        if ($pedido['Cabecera']['Pedido']['paga_cubierto'] == 1) {
            $impo_cubierto = $pedido['Cabecera']['Pedido']['precio_uni_cubierto'] * $pedido['Cabecera']['Pedido']['cant_clientes'];
        } else { 
            $impo_cubierto = 0; 
        }
        $impo_total_sin_dto  = $pedido['Cabecera']['Pedido']['impo_total_detalles'] + $pedido['Cabecera']['Pedido']['impo_total_agregados'] + $impo_cubierto;
        if (isset($pedido['Cabecera']['Descuento']['porcentaje'])) {
            $impo_dto = round($impo_total_sin_dto * $pedido['Cabecera']['Descuento']['porcentaje'] / 100.0, 2);
        } else {
            $impo_dto = 0;
        }
        $impo_factura = $impo_total_sin_dto - $impo_dto;

        foreach ($valores as $valor):
            if ($valor['Pedidovalor']['medio_pago'] == 1) {
                $impo_efectivo += $valor['Pedidovalor']['importe'];
            } else {
                $impo_otros += $valor['Pedidovalor']['importe'];
            }
        endforeach;
        
        if (($impo_otros + $impo_efectivo ) < $impo_factura) {
            $this->Session->setFlash('La suma de los medios de pago debe ser igual o mayor al total de la factura.');
            return false;            
        }
        if ($impo_otros > $impo_factura) {
            $this->Session->setFlash('La suma de los medios de pago no efectivos no puede ser mayor al total de la factura.');
            return false;            
        }
        
        return true;
    }    
    
    public function facturar($id = null) {
        App::uses('CakeTime', 'Utility');
        $this->loadModel('Pedidovalor');
        $this->loadModel('Facturacionxdia');
        $this->loadModel('Parametro');
        
        $paga_cubierto = $this->Parametro->find('first', array('conditions' => array('Parametro.param_nombre' => 'paga_cubierto'),'fields' => array('Parametro.valor')));
        $precio_uni_cubierto = $this->Parametro->find('first', array('conditions' => array('Parametro.param_nombre' => 'precio_cubierto'),'fields' => array('Parametro.valor')));        
        
        if ($this->validarPagoFactura($id)) {

            $pedido = $this->Pedido->getPedidoDetalle($id);
            if ($pedido['Cabecera']['Pedido']['paga_cubierto'] == 1) {
                $impo_cubierto = $pedido['Cabecera']['Pedido']['precio_uni_cubierto'] * $pedido['Cabecera']['Pedido']['cant_clientes'];
            } else { $impo_cubierto = 0; }           
            $impo_total_sin_dto  = $pedido['Cabecera']['Pedido']['impo_total_detalles'] + $pedido['Cabecera']['Pedido']['impo_total_agregados'] + $impo_cubierto;
            if (isset($pedido['Cabecera']['Descuento']['porcentaje'])) {
                $impo_dto = round($impo_total_sin_dto * $pedido['Cabecera']['Descuento']['porcentaje'] / 100.0, 2);
            } else {
                $impo_dto = 0;
            }
            $total_factura = $impo_total_sin_dto - $impo_dto;
            
            $pedido = $this->Pedido->findById($id);            
            
            $fecha_sin_hora = date(CakeTime::format($pedido['Pedido']['fecha'], '%Y/%m/%d'));
            
            $facturacion = $this->Facturacionxdia->find('first', array('conditions' => array('Facturacionxdia.fecha' => $fecha_sin_hora )));
            if (count($facturacion) == 0) { 
                $facturacion = $this->Facturacionxdia->create();
                $facturacion['Facturacionxdia']['fecha'] = $fecha_sin_hora;
                $facturacion['Facturacionxdia']['total'] = $total_factura;                
            } else {
                $facturacion['Facturacionxdia']['total'] += $total_factura;
            }
            
            $pedido['Pedido']['facturado'] = 1;
            $pedido['Pedido']['cerrado'] = 1;
            $pedido['Pedido']['paga_cubierto'] = $paga_cubierto['Parametro']['valor'];
            $pedido['Pedido']['precio_uni_cubierto'] = $precio_uni_cubierto['Parametro']['valor'];
            
            $dataSource = $this->Pedido->getDataSource();           
            $dataSource->begin();

            if ($this->Facturacionxdia->save($facturacion)) {
                // OK No hago nada
            } else {
                $dataSource->rollback();
                $this->Session->setFlash('Ocurrió un problema al facturar el pedido.');
                $this->set('pedido', $this->Pedido->getPedidoPago($id));
                $this->redirect('/pedidos/pagar/'.$id);    
            }           
            if ($this->Pedido->save($pedido)) {                
                $dataSource->commit();                
                $this->Session->setFlash('El pedido fue facturado.');
                $this->redirect('/pedidos/detalle/'.$id);
            } else {
                $dataSource->rollback();
                $this->Session->setFlash('Ocurrió un problema al facturar el pedido.');               
                $this->set('pedido', $this->Pedido->getPedidoPago($id));
                $this->redirect('/pedidos/pagar/'.$id);    
            }
        } else {
            $this->set('pedido', $this->Pedido->getPedidoPago($id));
            $this->redirect('/pedidos/pagar/'.$id); 

        }
    }    
    
    public function generarticket($id) {
            //Import /app/Vendor/Fpdf
            $this->loadModel('Empresa');
        
            App::import('Vendor', 'Fpdf', array('file' => 'fpdf/fpdf.php'));
            //Assign layout to /app/View/Layout/pdf.ctp
            $this->layout = 'pdf'; //this will use the pdf.ctp layout
            $this->response->type('pdf');
            //Set fpdf variable to use in view
            $this->set('fpdf', new FPDF('P','mm',array(100,150)));
            //obtengo el set de datos para usar en la vista que genera el pdf
            $this->set('pedido', $this->Pedido->getPedidoDetalle($id));
            $empresa = $this->Empresa->find('all');
            $this->set('empresa', $empresa[0]['Empresa']);

    }
    
    public function facturacion() {
        $this->loadModel('Facturacionxdia');
        $condiciones = array();

        $this->Session->delete('facturacion_filtros');
        $this->Session->delete('facturacion_datos');
        
        if (!empty($this->request->data)) {           
            // hubo submit
            $condiciones['fecha_desde'] = date('Y-m-d', strtotime($this->request->data['Pedido']['fecha_desde']));
            $condiciones['fecha_hasta'] = date('Y-m-d', strtotime($this->request->data['Pedido']['fecha_hasta']));
            $condiciones['corte_facturacion'] = $this->request->data['Pedido']['corte_facturacion'];

            if ($this->validarFiltrosFacturacion($condiciones)) {
                // cargo en la sesion los filtros que usará el generador de gráficos
                $resultado = $this->Facturacionxdia->obtenerReporteFacturacion($condiciones);
                
                $this->set('datos_reporte', $resultado);
                $this->set('corte_reporte', $condiciones['corte_facturacion']);

                $this->Session->write('facturacion_filtros', $condiciones);
                $this->Session->write('facturacion_datos', $resultado);
            }
        }               
        $this->data = $this->Pedido->create();        
    }

    private function validarFiltrosFacturacion($condiciones) {
        App::uses('CakeTime', 'Utility');

        $desde = new DateTime($condiciones['fecha_desde']);
        $hasta = new DateTime($condiciones['fecha_hasta']);
        $dif = $desde->diff($hasta);
        
        // valido si la diferencia de fechas es negativa
        if ($dif->format('%R') == '-') {
            $this->Session->setFlash('La fecha inicial no puede ser mayor a la fecha final.');
            return false;
        }
        
        if ($condiciones['corte_facturacion'] == 1) {
            $meses1 = date('m', strtotime($condiciones['fecha_desde']));
            $meses2 = date('m', strtotime($condiciones['fecha_hasta']));
            $año1 = date('Y', strtotime($condiciones['fecha_desde']));
            $año2 = date('Y', strtotime($condiciones['fecha_hasta']));
            
            $mes_dif = ($año2 - $año1) * 12 + ($meses2 - $meses1 );
        
            if ($mes_dif > 12) {
                $this->Session->setFlash('La cantidad de meses entre la fecha inicial y final no puede ser mayor a 12.');
                return false;
            }
        }
        if ($condiciones['corte_facturacion'] == 2) {
            if (($dif->days) > 30) {
                $this->Session->setFlash('La cantidad de días entre la fecha inicial y final no puede ser mayor a 31.');
                return false;
            }
        }
        
        return true;
    }

    public function rankproductos() {
        $this->loadModel('Rubro');
        $condiciones = array();

        $this->Session->delete('rankproductos_filtros');
        $this->Session->delete('rankproductos_datos');

        $this->set('rubros', $this->Rubro->find(
                'list',
                array(  
                    'fields' => array('id', 'descripcion'),  
                    'conditions' => array('Rubro.activo' => 1),
                    'order' => 'Rubro.descripcion ASC',  
                    'recursive' => -1  
                )  
            ));       
        
        if (!empty($this->request->data)) {           
            // hubo submit           
            $condiciones['fecha_desde'] = date('Y-m-d', strtotime($this->request->data['Pedido']['fecha_desde']));
            $condiciones['fecha_hasta'] = date('Y-m-d', strtotime($this->request->data['Pedido']['fecha_hasta']));
            $condiciones['rubro_id_sel'] = $this->request->data['Pedido']['rubro_id_sel'];
                       
            if ($this->validarFiltrosRankingProductos($condiciones)) {
                // cargo en la sesion los filtros que usará el generador de gráficos
                $resultado = $this->Pedido->obtenerRankingProductos($condiciones);
                
                $this->set('datos_reporte', $resultado);

                $this->Session->write('rankproductos_filtros', $condiciones);
                $this->Session->write('rankproductos_datos', $resultado);
            }
        }               
        $this->data = $this->Pedido->create();        
    }
    
    private function validarFiltrosRankingProductos($condiciones) {
        App::uses('CakeTime', 'Utility');

        $desde = new DateTime($condiciones['fecha_desde']);
        $hasta = new DateTime($condiciones['fecha_hasta']);
        $dif = $desde->diff($hasta);
        
        // valido si la diferencia de fechas es negativa
        if ($dif->format('%R') == '-') {
            $this->Session->setFlash('La fecha inicial no puede ser mayor a la fecha final.');
            return false;
        }
                        
        return true;
    }
    
    public function cambiarmozo($pedido_id = null) {
        $this->layout = 'ajax';
        $user_id_new = $this->request->data['user_id_'.$pedido_id];
        $this->set('datos', $user_id_new);
        $this->set('pedido_id', $pedido_id);

        $pedido = $this->Pedido->findById($pedido_id);
        if ($this->validarCambiarMozo($pedido)) {
            $pedido['Pedido']['user_id'] = $user_id_new;
            if ($this->Pedido->save($pedido)) {
                $this->Session->setFlash('El mozo del pedido fue actualizado.');
            }
        }         
    }
    
    private function validarCambiarMozo($pedido) {
        if ($pedido['Pedido']['cancelado'] == 1) {
            $this->Session->setFlash('El pedido ya fue cancelado. No se puede cambiar el mozo asignado.');
            return false;
        }
        if ($pedido['Pedido']['facturado'] == 1) {
            $this->Session->setFlash('El pedido ya fue facturado. No se puede cambiar el mozo asignado.');
            return false;
        }                        
        return true;
    }
    
    
}

                
?>
